/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package armazemseujose.controller;

import armazemseujose.model.*;
import armazemseujose.view.*;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author BRUNA
 */
public class armazemControl {

    private armazemSeuJoseView view;
    private listaClientes clientes;
    private listaItens itens;
    private listaVendas vendas;
    private listaCompra compras;
    private listaEstoque estoque;
    private grafico grafico;

    public armazemControl(armazemSeuJoseView view) throws FileNotFoundException {
        this.view = view;
        clientes = new listaClientes();
        itens = new listaItens();
        vendas = new listaVendas();
        compras = new listaCompra();
        estoque = new listaEstoque();
        grafico = new grafico();
    }

    public void cadastrarCliente() throws IOException {
        Cliente cliente = new Cliente();
        cliente.setNome(getView().getViewCliente().getNomeCliente().getText());
        cliente.setEndereco(getView().getViewCliente().getEnderecoCliente().getText());
        cliente.setTelefone(Long.parseLong(getView().getViewCliente().getTelefone().getText()));
        getClientes().add(cliente);

    }

    public void cadastrarItem() throws IOException {
        Item item = new Item();
        item.setNome(getView().getViewItem().getJnomeItem().getText());
        item.setPrecoVenda(Double.parseDouble(getView().getViewItem().getJprecoUn().getText()));
        getItens().add(item);
    }

    public void cadastrarCompra() throws IOException {
        Compra c = new Compra();
        String nome = getView().getViewCompra().getNomeItem().getText();
        Item i = getItens().procuraItem(nome);
        i = getItens().procuraItem(nome);
        if (i == null) {
            JOptionPane.showMessageDialog(getView(), "Item não cadastrado. Vamos cadastrar");
            getView().novoItem();
            i = getItens().procuraItem(nome);
        }
        c.setItem(i);
        c.setQuantidade(Integer.parseInt(getView().getViewCompra().getQtdItem().getText()));
        c.setPrecoUn(Double.parseDouble(view.getViewCompra().getPrecoCompra().getText()));
        c.setPrecoTotal(Double.parseDouble(view.getViewCompra().getPrecoCompra().getText()) * Integer.parseInt(getView().getViewCompra().getQtdItem().getText()));
        getCompras().add(c);
        getEstoque().alteraEstoque(Integer.parseInt(getView().getViewCompra().getQtdItem().getText()), i);
    }

    public void cadastrarVenda() throws IOException {
        Cliente c = getClientes().procuraCliente(getView().getViewVenda().getNomeClienteVenda().getText());
        if (c == null) {
            clienteNaoCadastrado();
        }
        Venda v = new Venda(c);
        DefaultTableModel tabel = (DefaultTableModel) getView().getViewVenda().getModel();
        String nome;
        int qtd;
        double precoTotal = 0;
        infoItemVenda item;
        for (int i = 0; i < tabel.getRowCount(); i++) {
            nome = (String) tabel.getValueAt(i, 0);
            qtd = Integer.parseInt(tabel.getValueAt(i, 1).toString());
            item = new infoItemVenda(getItens().procuraItem(nome), qtd);
            v.addItem(item);
            precoTotal = precoTotal + (qtd * item.getItem().getPrecoVenda());
            getEstoque().alteraEstoque(-qtd, item.getItem());
        }
        v.setValorTotal(precoTotal);
        getVendas().add(v);
    }

    public void clienteNaoCadastrado() {
        JOptionPane.showMessageDialog(getView(), "Cliente não cadastrado. Vamos cadastrar");
        getView().novoCliente();
    }

    public Item itemNaoCadastrado(String nome) {
        JOptionPane.showMessageDialog(getView(), "Item não cadastrado. Vamos cadastrar");
        getView().novoItem();
        Item i = getItens().procuraItem(nome);
        return i;
    }

    public void addItemVenda() {
        String nome = getView().getViewVenda().getItemVenda().getText();
        Estoque itemEstoque = getEstoque().procuraItemEstoque(nome);
        if (itemEstoque == null) {
            JOptionPane.showMessageDialog(getView(), "Item não cadastrado");
            getView().getViewVenda().getQtdItemVenda().setText("");
            getView().getViewVenda().getItemVenda().setText("");
        } else {
            Item item = itemEstoque.getItem();
            String qtd = getView().getViewVenda().getQtdItemVenda().getText();
            int qtdEstoque = getEstoque().procuraItemEstoque(nome).getQuantidade();
            if (qtdEstoque < Integer.parseInt(qtd)) {
                JOptionPane.showMessageDialog(getView(), "Estoque insuficiente");
                getView().getViewVenda().getItemVenda().setText("");
                getView().getViewVenda().getQtdItemVenda().setText("");
            } else {
                String[] infoItem = {item.getNome(), qtd};
                DefaultTableModel model = (DefaultTableModel) getView().getViewVenda().getModel();
                model.addRow(infoItem);
                getView().getViewVenda().getQtdItemVenda().setText("");
                getView().getViewVenda().getItemVenda().setText("");
            }
        }
    }

    public void estoque() {
        DefaultTableModel model2 = (DefaultTableModel) getView().getViewEstoque().getModel();
        for (int i = 0; i < getEstoque().getEstoque().size(); i++) {
            String[] conteudo = {getEstoque().getEstoque().get(i).getItem().getNome(), String.valueOf(getEstoque().getEstoque().get(i).getQuantidade())};
            model2.addRow(conteudo);
        }
    }

    public void vendasCliente() {
        DefaultTableModel model = (DefaultTableModel) getView().getRelatorioCliente().getModel();
        String nomeCliente = getView().getRelatorioCliente().getNomeClienteRelatorio().getText();
        ArrayList<Venda> vendasAux = getVendas().getVendas();
        String nomeClienteAux;
        for (Venda i : vendasAux) {
            nomeClienteAux = i.getCliente().getNome();
            if (nomeCliente.equalsIgnoreCase(nomeClienteAux)) {
                ArrayList<infoItemVenda> itensCliente = i.getItens();
                for (infoItemVenda j : itensCliente) {
                    String nomeItem = j.getItem().getNome();
                    int qtd = j.getQuantidade();
                    String[] itemQtd = {nomeItem, String.valueOf(qtd), (String.valueOf(Math.floor(qtd * j.getItem().getPrecoVenda())))};
                    model.addRow(itemQtd);
                }
            }

        }
    }

    public void vendasItem() {
        ArrayList<Venda> vendasCadastradas = getVendas().getVendas();
        DefaultTableModel model = (DefaultTableModel) getView().getRelatorioItem().getModel();
        String nomeItem = getView().getRelatorioItem().getNomeItem().getText();
        String nomeItemVendido;
        for (Venda i : vendasCadastradas) {
            for (infoItemVenda j : i.getItens()) {
                nomeItemVendido = j.getItem().getNome();
                if (nomeItemVendido.equalsIgnoreCase(nomeItem)) {
                    String nomeCliente = i.getCliente().getNome();
                    int qtd = j.getQuantidade();
                    double valor = qtd * j.getItem().getPrecoVenda();
                    String[] dados = {nomeCliente, String.valueOf(qtd), String.valueOf(valor)};
                    model.addRow(dados);
                }
            }
        }
    }

    public void relatorioFinanceiro() {
        DefaultTableModel model = (DefaultTableModel) getView().getViewFinanceiro().getModel();
        String totalVendas = String.valueOf(Math.floor(getVendas().calculaTotalVenda()));
        String totalCompras = String.valueOf(Math.floor(getCompras().calculaTotalCompras()));
        String lucroPrejuizo = String.valueOf(Math.floor(getVendas().calculaTotalVenda() - getCompras().calculaTotalCompras()));
        String[] dados = {totalVendas, totalCompras, lucroPrejuizo};
        model.addRow(dados);
    }
    
    
    public void graficoVendasItem() throws FileNotFoundException{
        grafico.criaGraficoVendaProduto(view.getGraficos().getPanel());
    }
    
    public void graficoVendasCliente() throws FileNotFoundException{
        grafico.criaGraficoVendaCliente(view.getGraficos().getPanel());
    }

    /**
     * @return the view
     */
    public armazemSeuJoseView getView() {
        return view;
    }

    /**
     * @param view the view to set
     */
    public void setView(armazemSeuJoseView view) {
        this.view = view;
    }

    /**
     * @return the clientes
     */
    public listaClientes getClientes() {
        return clientes;
    }

    /**
     * @param clientes the clientes to set
     */
    public void setClientes(listaClientes clientes) {
        this.clientes = clientes;
    }

    /**
     * @return the itens
     */
    public listaItens getItens() {
        return itens;
    }

    /**
     * @param itens the itens to set
     */
    public void setItens(listaItens itens) {
        this.itens = itens;
    }

    /**
     * @return the vendas
     */
    public listaVendas getVendas() {
        return vendas;
    }

    /**
     * @param vendas the vendas to set
     */
    public void setVendas(listaVendas vendas) {
        this.vendas = vendas;
    }

    /**
     * @return the compras
     */
    public listaCompra getCompras() {
        return compras;
    }

    /**
     * @param compras the compras to set
     */
    public void setCompras(listaCompra compras) {
        this.compras = compras;
    }

    /**
     * @return the estoque
     */
    public listaEstoque getEstoque() {
        return estoque;
    }

    /**
     * @param estoque the estoque to set
     */
    public void setEstoque(listaEstoque estoque) {
        this.estoque = estoque;
    }
}
